package com.hunan.api.catv.entity.dto;

import cn.hutool.core.lang.UUID;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.URLUtil;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;
import org.springframework.util.Assert;
import org.springframework.util.DigestUtils;

import java.time.LocalDateTime;
import java.time.ZoneOffset;
import java.util.LinkedHashMap;
import java.util.Map;

/**
 * @author jiang zhuan
 * @version 1.0
 * @description 描述
 * @date 2021/9/1 0001
 * @package com.hunan.api.catv.entity.dto
 * @company 湖南有线
 */
@Data
public class AntiTheftChainConfig {

    /**
     * 开启 Key 防盗链时填写的密钥
     * (KEY)
     * 必选
     */
    private String key;

    /**
     * 视频原始 URL 的 PATH 中除去文件名的那部分路径
     * (Dir)
     * 必选
     */
    private String dir;

    /**
     * 最多允许多少个不同 IP 的终端播放，以十进制表示，最大值为9，不填表示不做限制
     * (rlimit)
     */
    private Integer rlimit;


    /**
     * 播放地址的过期时间戳，以 Unix 时间的十六进制小写形式表示
     * (t)
     * 必选
     */
    private String expireTimestamp;

    /**
     * 试看时长，单位为秒，以十进制表示，不填或者填0表示不试看
     * (exper)
     */
    private Integer exper;

    /**
     * 链接标识，用于随机化一个防盗链 URL，增强链接的唯一性
     * (us)
     */
    private String us;

    /**
     * 防盗链签名，以32个字符长的十六进制数表示，用于校验防盗链 URL 的合法性
     * sign = md5(KEY + Dir + t + exper + rlimit + us)
     * 必选
     */
    private String sign;

    /**
     * http://example.vod2.myqcloud.com/dir1/dir2/myVideo.mp4?t=[t]&exper=[exper]&rlimit=[rlimit]&us=[us]&sign=[sign]
     * QueryString 中的防盗链参数必须按照t、exper、rlimit、us、sign的顺序拼接
     * @return
     */
    public String getAntiTheftUrl(String url) {
        Assert.isTrue(StringUtils.isNotBlank(url), "URL不能为空");
        Assert.notNull(this.key, "加密key不能为空");
        String path = URLUtil.getPath(url);
        this.dir = path.substring(0, path.lastIndexOf("/")+1);

        if (StringUtils.isBlank(this.expireTimestamp)) {
            this.expireTimestamp = Long.toHexString(LocalDateTime.now().plusHours(3L).toEpochSecond(ZoneOffset.of("+8")));
        }
        StringBuilder sb = new StringBuilder();
        Map<String, Object> queryMap = new LinkedHashMap<>();
        sb = sb.append(this.key).append(this.dir).append(this.expireTimestamp);
        queryMap.put("t", this.expireTimestamp);
        if (this.exper != null) {
            sb.append(this.exper);
            queryMap.put("exper", this.exper);
        }
        if (this.rlimit != null) {
            sb.append(this.rlimit);
            queryMap.put("rlimit", this.rlimit);
        }
        this.us = UUID.fastUUID().toString(true).substring(0, 10);
        sb.append(this.us);
        queryMap.put("us", this.us);
        this.sign = signTheStr(sb.toString());
        queryMap.put("sign", this.sign);
        String queryString = URLUtil.buildQuery(queryMap, CharsetUtil.CHARSET_UTF_8);
        if (url.indexOf("?") > -1) {
            return url + "&" + queryString;
        }
        return url + "?" + queryString;

    }

    private String signTheStr(String str) {
        return DigestUtils.md5DigestAsHex(str.getBytes());
    }

}
